home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / ms_dos / dsort / dstoptn.pre < prev    next >
Text File  |  1993-07-08  |  23KB  |  819 lines

  1.     page    96,132
  2. ;§∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞§
  3. ;§                                                                          §
  4. ;§              ディレクトリエントリ  ソート  ユーティリティ                §
  5. ;§                                                                          §
  6. ;§                                     DSORT.EXE  Ver1.30    §
  7. ;§                                                                          §
  8. ;§              Copyright (C) by 福地 邦雄 1991-1992. All rights reserved.  §
  9. ;§∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞§
  10.     .MODEL  SMALL,C
  11. ;
  12.     public  options,usageout,dirlist,dirfind,strcopywild
  13.     extrn   sweep:word,sortexec:word,recursive:word,dirgather:word
  14.     extrn   dta:dword,srchname:dword,namebuff:dword,namebuffsiz:word
  15.     extrn   dirtype:word,fattype:word,attribute:word,clustcount:word
  16.     extrn   driveno:word,clustsize:word
  17.     extrn   fatbuff:word,dirbuff:word,sortbuff:word,sortcount:word
  18.     extrn   drvinf:byte,clustsect:word,subsearch:word
  19.     extrn   sortfuncs:word,subchain:word,wildcard:byte,pathbuff:byte
  20.     extrn   usagemsg:byte,_msgsize:abs
  21.     extrn   abort:near
  22.     extrn   errorno:word
  23. ;
  24.     PUBLIC  setsortfunc,setsortobj,cmpdummy,cmpdirf,cmpfull,cmpname
  25.     PUBLIC  cmpextn,cmpsize,cmpdate,cmptime,strncmp,chrtypes,pathsep
  26. ;
  27. REVERSE equ 1
  28. NORMAL  equ 0
  29. TAIL    equ 1
  30. HEAD    equ 0
  31. YES     equ 1
  32. NO      equ 0
  33. TAB     equ 9
  34. CR      equ 0dh
  35. LF      equ 0ah
  36. DEFAULT equ 031h
  37. ARCHIVE equ 020h
  38. SUBDIR  equ 010h
  39. VOLUME  equ 008h
  40. HIDDEN  equ 004h
  41. SYSTEM  equ 002h
  42. RDONLY  equ 001h
  43. ;
  44.     .code
  45. ;
  46. ;------------------------------------------------------------------------------
  47. ;
  48. ;   options
  49. ;       オプション指定の評価とディレクトリのリストを取る
  50. ;
  51. ;   TYPE    near call
  52. ;   IN  AX アーギュメント数
  53. ;       SS:BP アーギュメントポインタリストの先頭アドレス
  54. ;   OUT 特になし
  55. ;   保存レジスタ    ds
  56. ;
  57. ;------------------------------------------------------------------------------
  58. ;
  59. options proc
  60. ;
  61.     cld
  62.     push    ax
  63.     mov     ah,2fh                  ; Disk Transfer Address 取得
  64.     int     21h
  65.     lea     bx,[bx+1eh]             ; DTAのファイル名オフセット
  66.     mov     word ptr dta,bx
  67.     mov     word ptr dta+2,es
  68.     pop     bx
  69.     mov     sortfuncs,offset _text:cmpdummy ; ダミーのソート比較関数セット
  70.     mov     word ptr sortfuncs+2,NORMAL
  71.     mov     si,offset sortfuncs+4
  72.     mov     attribute,DEFAULT       ; ソート対象属性のデフォルトセット
  73.     @do until
  74.         les     di,[bp]
  75.         @cbegin
  76.         @case (byte ptr es:[di],=,'-'),S
  77.             call    setsortfunc
  78.         @case (byte ptr es:[di],=,'+'),S
  79.             call    setsortobj
  80.         @other
  81.             mov     word ptr srchname,di    ; ディレクトリ名リストの作成
  82.             mov     word ptr srchname+2,es
  83.             call    dirlist
  84.         @cend
  85.         add     bp,4                ; 次のアーギュメントへ
  86.         dec     bx
  87.     @doend (zf,on)
  88.     @if (si,=,offset sortfuncs+4)
  89.         mov     word ptr [si],offset cmpfull    ; デフォルトの比較関数セット
  90.         mov     word ptr [si+2],NORMAL
  91.         lea     si,[si+4]
  92.     @ifend
  93.     not     attribute               ; ソート対象属性を反転させたものを使う
  94.     mov     word ptr [si],0         ; ソート比較関数リストのエンドマーク
  95.     les     di,namebuff             ; ディレクトリ名リストのエンドマーク
  96.     mov     word ptr es:[di],0
  97.     @if (word ptr es:[0],=,0)
  98.         jmp     usageout            ; ディレクトリ無しの時、ヘルプ表示
  99.     @ifend
  100.     ret
  101. ;
  102. options endp
  103. ;
  104. ;------------------------------------------------------------------------------
  105. ;
  106. ;   usageout
  107. ;       ヘルプメッセージを表示して終了
  108. ;
  109. ;   TYPE    near call
  110. ;   IN  なし
  111. ;   OUT なし
  112. ;   保存レジスタ    なし
  113. ;
  114. ;------------------------------------------------------------------------------
  115. ;
  116. usageout    proc
  117. ;
  118.     mov     errorno,1
  119.     mov     dx,offset usagemsg
  120.     mov     cx,_msgsize
  121.     jmp     abort
  122. ;
  123. usageout    endp
  124. ;
  125. ;------------------------------------------------------------------------------
  126. ;
  127. ;   setsortfunc
  128. ;       ソート機能指定オプションの評価と、比較関数リストの作成
  129. ;
  130. ;   TYPE    near call
  131. ;   IN      AL アーギュメント文字
  132. ;           DS:SI 比較関数リストアドレス
  133. ;   OUT     SI += 4 
  134. ;   保存レジスタ    bx,cx,dx,di,bp,ds,es
  135. ;
  136. ;------------------------------------------------------------------------------
  137. ;
  138. setsortfunc proc
  139. ;
  140.     inc     di
  141.     @do repeat
  142.         mov     al,es:[di]
  143.         inc     di
  144.         @if (al,=,0)
  145.             @doexit
  146.         @ifend
  147.         @if (al,>=,'a'),S           ; 昇順
  148.             mov     word ptr [si+2],NORMAL
  149.             sub     al,'a'-'A'
  150.         @else                       ; 降順
  151.             mov     word ptr [si+2],REVERSE
  152.         @ifend
  153.         @cbegin
  154.         @case (al,=,'D'),S          ; 最終更新日付
  155.             mov     ax,offset _text:cmpdate
  156.         @case (al,=,'E'),S          ; 拡張子 3バイト
  157.             mov     ax,offset _text:cmpextn
  158.         @case (al,=,'F'),S          ; フルネーム 11バイト
  159.             mov     ax,offset _text:cmpfull
  160.         @case (al,=,'N'),S          ; ファイル名 8バイト
  161.             mov     ax,offset _text:cmpname
  162.         @case (al,=,'S'),S          ; ファイルサイズ
  163.             mov     ax,offset _text:cmpsize
  164.         @case (al,=,'T'),S          ; 最終更新時刻
  165.             mov     ax,offset _text:cmptime
  166.         @other
  167.             jmp     usageout
  168.         @cend
  169.         mov     [si],ax
  170.         lea     si,[si+4]
  171.     @doend
  172.     ret
  173. ;
  174. setsortfunc endp
  175. ;
  176. ;------------------------------------------------------------------------------
  177. ;
  178. ;   setsortobj
  179. ;       ソート対象選択オプション評価
  180. ;
  181. ;   TYPE    near call
  182. ;   IN  AL アーギュメント文字
  183. ;   OUT なし
  184. ;   保存レジスタ    AX以外
  185. ;
  186. ;------------------------------------------------------------------------------
  187. ;
  188. setsortobj  proc
  189. ;
  190.     inc     di
  191.     @do repeat
  192.         mov     al,es:[di]
  193.         inc     di
  194.         @if (al,=,0)
  195.             @doexit
  196.         @ifend
  197.         @if (al,>=,'a'),S           ; 先頭に
  198.             mov     dirgather,HEAD
  199.             sub     al,'a'-'A'
  200.         @else                       ; 末尾に
  201.             mov     dirgather,TAIL
  202.         @ifend
  203.         @cbegin
  204.         @case (al,=,'G'),S          ; ディレクトリの扱い
  205.             mov     sortfuncs,offset _text:cmpdirf
  206.             mov     ax,dirgather
  207.             mov     sortfuncs+2,ax
  208.         @case (al,=,'T'),S          ; 再帰呼び出し
  209.             mov     recursive,YES
  210.         @case (al,=,'N'),S          ; ソート無し
  211.             mov     sortexec,NO
  212.         @case (al,=,'F'),S          ; 掃き寄せ無し
  213.             mov     sweep,NO
  214.         @case (al,=,'A'),S          ; アーカイブ属性
  215.             xor     attribute,ARCHIVE
  216.         @case (al,=,'D'),S          ; ディレクトリ
  217.             xor     attribute,SUBDIR
  218.         @case (al,=,'V'),S          ; ボリュームラベル
  219.             xor     attribute,VOLUME
  220.         @case (al,=,'S'),S          ; システムファイル
  221.             xor     attribute,SYSTEM
  222.         @case (al,=,'H'),S          ; 隠しファイル
  223.             xor     attribute,HIDDEN
  224.         @case (al,=,'R'),S          ; 読み出しのみ可能
  225.             xor     attribute,RDONLY
  226.         @other
  227.             jmp     usageout
  228.         @cend
  229.     @doend
  230.     ret
  231. ;
  232. setsortobj  endp
  233. ;
  234. ;------------------------------------------------------------------------------
  235. ;
  236. ;   cmpdummy
  237. ;       ダミー比較ルーチン 必ず = で終了
  238. ;
  239. ;   TYPE    near call
  240. ;   IN  なし
  241. ;   OUT AX=0 ZERO FLAG=1
  242. ;   保存レジスタ    AX以外
  243. ;
  244. ;------------------------------------------------------------------------------
  245. ;
  246. cmpdummy    proc
  247. ;
  248.     xor     ax,ax
  249.     ret
  250. ;
  251. cmpdummy    endp
  252. ;
  253. ;------------------------------------------------------------------------------
  254. ;
  255. ;   cmpdirf
  256. ;       ディレクトリ属性比較
  257. ;
  258. ;   TYPE    near call
  259. ;   IN      DS:0  エントリ1アドレス
  260. ;           DX:0  エントリ2アドレス
  261. ;   OUT     AX ディレクトリ:通常= -1  通常:ディレクトリ= 1  その他 0
  262. ;   保存レジスタ    AX以外
  263. ;
  264. ;------------------------------------------------------------------------------
  265. ;
  266. cmpdirf proc
  267. ;
  268.     mov     al,ds:[0bh]             ; 属性バイトの取り出し
  269.     push    es
  270.     mov     es,dx
  271.     mov     ah,es:[0bh]
  272.     pop     es
  273.     and     ax,01010h
  274.     cmp     al,ah
  275.     ja      dirfhead                ; Dir:File
  276.     jb      dirftail                ; File:Dir
  277.     xor     ax,ax                   ; 同じ属性
  278.     ret
  279. dirfhead:
  280.     mov     ax,-1
  281.     ret
  282. dirftail:
  283.     mov     ax,1
  284.     ret
  285. ;
  286. cmpdirf endp
  287. ;
  288. ;------------------------------------------------------------------------------
  289. ;
  290. ;   cmpfull
  291. ;       フルネーム比較
  292. ;
  293. ;   TYPE    near call
  294. ;   IN      DS:0  エントリ1アドレス
  295. ;           dx:0  エントリ2アドレス
  296. ;   OUT     AX エントリ1<エントリ2= -1  エントリ1=エントリ2= 0  エントリ1>エントリ2= 1
  297. ;   保存レジスタ    bx,dx,bp,ds,es
  298. ;
  299. ;------------------------------------------------------------------------------
  300. ;
  301. cmpfull proc
  302. ;
  303.     mov     cx,11
  304.     xor     si,si
  305.     xor     di,di
  306.     call    strncmp
  307.     ret
  308. ;
  309. cmpfull endp
  310. ;
  311. ;------------------------------------------------------------------------------
  312. ;
  313. ;   cmpname
  314. ;       ファイル名比較
  315. ;
  316. ;   TYPE    near call
  317. ;   IN      DS:0  エントリ1アドレス
  318. ;           dx:0  エントリ2アドレス
  319. ;   OUT     AX エントリ1<エントリ2= -1  エントリ1=エントリ2= 0  エントリ1>エントリ2= 1
  320. ;   保存レジスタ    bx,dx,bp,ds,es
  321. ;
  322. ;------------------------------------------------------------------------------
  323. ;
  324. cmpname proc
  325. ;
  326.     mov     cx,8
  327.     xor     si,si
  328.     xor     di,di
  329.     call    strncmp
  330.     ret
  331. ;
  332. cmpname endp
  333. ;
  334. ;------------------------------------------------------------------------------
  335. ;
  336. ;   cmpextn
  337. ;       拡張子比較
  338. ;
  339. ;   TYPE    near call
  340. ;   IN      DS:0  エントリ1アドレス
  341. ;           dx:0  エントリ2アドレス
  342. ;   OUT     AX エントリ1<エントリ2= -1  エントリ1=エントリ2= 0  エントリ1>エントリ2= 1
  343. ;   保存レジスタ    bx,dx,bp,ds,es
  344. ;
  345. ;------------------------------------------------------------------------------
  346. ;
  347. cmpextn proc
  348. ;
  349.     mov     si,8                    ; 拡張子位置
  350.     mov     di,si
  351.     mov     cx,3
  352.     call    strncmp
  353.     ret
  354. ;
  355. cmpextn endp
  356. ;
  357. ;------------------------------------------------------------------------------
  358. ;
  359. ;   cmpsize
  360. ;       ファイルサイズ比較
  361. ;
  362. ;   TYPE    near call
  363. ;   IN  DS:0  エントリ1アドレス
  364. ;       DX:0  エントリ2アドレス
  365. ;   OUT AX エントリ1<エントリ2= -1  エントリ1=エントリ2= 0  エントリ1>エントリ2= 1
  366. ;   保存レジスタ    bx,dx,si,di,bp,ds,es
  367. ;
  368. ;------------------------------------------------------------------------------
  369. ;
  370. cmpsize proc
  371. ;
  372.     push    es
  373.     mov     es,dx
  374.     mov     ax,es:[1ch]             ; エントリ2のファイルサイズ4バイト
  375.     mov     cx,es:[1eh]
  376.     pop     es
  377.     cmp     cx,ds:[1eh]             ; エントリ1と比較
  378.     ja      sizeabove
  379.     jb      sizebelow
  380.     cmp     ax,ds:[1ch]
  381.     ja      sizeabove
  382.     jb      sizebelow
  383.     xor     ax,ax
  384.     ret
  385. sizeabove:
  386.     mov     ax,-1
  387.     ret
  388. sizebelow:
  389.     mov     ax,1
  390.     ret
  391. ;
  392. cmpsize endp
  393. ;
  394. ;------------------------------------------------------------------------------
  395. ;
  396. ;   cmpdate
  397. ;       最終更新日付比較
  398. ;
  399. ;   TYPE    near call
  400. ;   IN  DS:0  エントリ1アドレス
  401. ;       DX:0  エントリ2アドレス
  402. ;   OUT AX エントリ1<エントリ2= -1  エントリ1=エントリ2= 0  エントリ1>エントリ2= 1
  403. ;   保存レジスタ    bx,dx,si,di,bp,ds,es
  404. ;
  405. ;------------------------------------------------------------------------------
  406. ;
  407. cmpdate proc
  408. ;
  409.     mov     ax,ds:[18h]
  410.     push    es
  411.     mov     es,dx
  412.     cmp     ax,es:[18h]
  413.     pop     es
  414.     ja      dateabove
  415.     jb      datebelow
  416.     xor     ax,ax
  417.     ret
  418. dateabove:
  419.     mov     ax,1
  420.     ret
  421. datebelow:
  422.     mov     ax,-1
  423.     ret
  424. ;
  425. cmpdate endp
  426. ;
  427. ;------------------------------------------------------------------------------
  428. ;
  429. ;   cmptime
  430. ;       最終更新時刻比較
  431. ;
  432. ;   TYPE    near call
  433. ;   IN  DS:0  エントリ1アドレス
  434. ;       DX:0  エントリ2アドレス
  435. ;   OUT AX エントリ1<エントリ2= -1  エントリ1=エントリ2= 0  エントリ1>エントリ2= 1
  436. ;   保存レジスタ    bx,dx,si,di,bp,ds,es
  437. ;
  438. ;------------------------------------------------------------------------------
  439. ;
  440. cmptime proc
  441. ;
  442.     mov     ax,ds:[16h]
  443.     push    es
  444.     mov     es,dx
  445.     cmp     ax,es:[16h]
  446.     pop     es
  447.     ja      timeabove
  448.     jb      timebelow
  449.     xor     ax,ax
  450.     ret
  451. timeabove:
  452.     mov     ax,1
  453.     ret
  454. timebelow:
  455.     mov     ax,-1
  456.     ret
  457. ;
  458. cmptime endp
  459. ;
  460. ;------------------------------------------------------------------------------
  461. ;
  462. ;   strncmp
  463. ;       文字列比較 漢字対応 漢字はANKより大きい
  464. ;
  465. ;   TYPE    near call
  466. ;   IN  CX 比較サイズ
  467. ;       DS:SI エントリ1アドレス
  468. ;       ES:DI エントリ2アドレス
  469. ;   OUT AX エントリ1<エントリ2= -1  エントリ1=エントリ2= 0  エントリ1>エントリ2= 1
  470. ;   保存レジスタ    bx,dx,si,di,bp,ds,es
  471. ;
  472. ;------------------------------------------------------------------------------
  473. ;
  474. strncmp proc    uses bx es
  475. ;
  476.     cld
  477.     mov     es,dx
  478.     @do until
  479.         dec     cx
  480.         mov     ax,[si]             ; エントリ1 1文字取得
  481.         inc     si
  482.         call    chrtypes
  483.         @if (zf,off)
  484.             dec     cx
  485.             inc     si
  486.         @ifend
  487. ;
  488.         mov     bx,ax
  489.         mov     ax,es:[di]          ; エントリ2 1文字取得
  490.         inc     di
  491.         call    chrtypes
  492.         @if (zf,off)
  493.             inc     di
  494.         @ifend
  495.         cmp     bx,ax               ; 比較
  496.         ja      strabove
  497.         jb      strbelow
  498.         or      cx,cx
  499.     @doend (zf,on),or,(sf,on)
  500. ;
  501.     xor     ax,ax
  502. streturn:
  503.     ret
  504. ;
  505. strabove:
  506.     mov     ax,1
  507.     jmp     streturn
  508. strbelow:
  509.     mov     ax,-1
  510.     jmp     streturn
  511. ;
  512. strncmp endp
  513. ;
  514. ;------------------------------------------------------------------------------
  515. ;
  516. ;   chrtypes
  517. ;       漢字判定
  518. ;
  519. ;   TYPE    near call
  520. ;   IN  AX 文字コード AL=第一バイト
  521. ;   OUT AX 判定後コード ANK:AH=0
  522. ;       ZERO FLAG AHのTEST結果
  523. ;   保存レジスタ    AX以外
  524. ;
  525. ;------------------------------------------------------------------------------
  526. ;
  527. chrtypes    proc
  528. ;
  529.     cmp     al,081h
  530.     jb      chrank
  531.     cmp     al,0a0h
  532.     jb      chrsjis
  533.     cmp     al,0e0h
  534.     jb      chrank
  535.     cmp     al,0fch
  536.     jbe     chrsjis
  537. chrank:
  538.     xor     ah,ah
  539.     ret
  540. chrsjis:
  541.     xchg    ah,al
  542.     test    ah,ah
  543.     ret
  544. ;
  545. chrtypes    endp
  546. ;
  547. ;------------------------------------------------------------------------------
  548. ;
  549. ;   dirlist
  550. ;       全てのディレクトリ名を検索して、そのパス名をバッファに格納する
  551. ;       ワイルドカード対応  FUNCTION    4EH,4FH
  552. ;
  553. ;   TYPE    near call
  554. ;   IN  検索情報構造体
  555. ;   OUT ディレクションフラグ アップ方向
  556. ;   保存レジスタ    bp,ds
  557. ;
  558. ;------------------------------------------------------------------------------
  559. ;
  560. dirlist    proc uses bx si
  561.         local copysiz,fnamsiz,saveds
  562. ;
  563.     mov     saveds,ds               ;DS セーブ
  564.     les     di,srchname             ;パス名の長さと、最終位置を獲得
  565.     mov     cx,0ffffh
  566.     cld
  567.     xor     al,al
  568.   repne scasb
  569.     not     cx
  570.     dec     cx
  571.     mov     fnamsiz,cx
  572.     mov     di,word ptr srchname
  573.     call    pathsep                 ; パス名中の最後の'\'位置を獲得
  574.     mov     copysiz,cx              ; バッファへの共通コピーサイズをセット
  575.     mov     di,word ptr srchname
  576.     mov     dx,es:[di]
  577.     @cbegin
  578.     @case (zf,on)                   ; セパレータなし
  579.         @if (dx,=,'.'),or,(dx,=,'..')   ; カレント/親?
  580.             jmp parentdir
  581.         @ifend
  582.     @case (fnamsiz,=,1),and,(dl,=,'\'),S ; ルート指定か?
  583.         mov     ah,19h              ; カレントドライブ取得
  584.         int     21h
  585.         add     al,'A'              ; ドライブ名作成
  586.         mov     ah,':'
  587.         jmp     rootpath
  588.     @case (cx,=,2),S                ; カレント/親 指定か?
  589.         @if (dh,=,':')
  590.             @if (fnamsiz,=,2)
  591.                 sub     namebuffsiz,4   ; ディレクトリ名バッファサイズチェック
  592.                 @if (cf,on)
  593.                     add     namebuffsiz,4
  594.                     jmp     srchout
  595.                 @ifend
  596.                 cld
  597.                 les     di,namebuff
  598.                 mov     ax,dx           ; ドライブ名
  599.                 stosw
  600.                 mov     ax,'.'          ; カレントディレクトリ指定
  601.                 stosw
  602.                 mov     word ptr namebuff,di    ; 新オフセット設定
  603.                 jmp     srchout
  604.             @ifend
  605.             @if (fnamsiz,<=,4)
  606.                 mov ax,es:[di+2]
  607.                 @if (ax,=,'.'),or,(ax,=,'..')
  608.                     jmp parentdir
  609.                 @ifend
  610.             @ifend
  611.         @ifend
  612.     @case (fnamsiz,=,3),and,(word ptr es:[di+1],=,'\:'),S ; ルート指定か?
  613.         mov     ax,dx
  614. rootpath:
  615.         sub     namebuffsiz,3       ; バッファ残りサイズ確認
  616.         @if (cf,on)
  617.             add     namebuffsiz,3
  618.             jmp     srchout
  619.         @ifend
  620.         cld
  621.         les     di,namebuff         ; ドライブ名のみセット
  622.         stosw
  623.         xor     al,al
  624.         stosb
  625.         mov     word ptr namebuff,di
  626.         jmp     srchout
  627.     @cend
  628. ;
  629.     mov     ah,4eh                  ;最初のファイル名検索ファンクション
  630.     mov     cx,037h                 ;ボリュームラベル以外すべて
  631.     lds     dx,srchname
  632.     int     21h
  633.     @do while,(cf,off)
  634.         mov     ds,saveds           ; DS 復元
  635.         les     di,dta
  636.         @if (byte ptr es:[di-9],on,10h) ;ディレクトリかどうかのチェック
  637.             mov     dx,es:[di]      ; 再帰処理のさいに '.' '..' を外す
  638.             @if (subsearch,=,YES)
  639.                 @if (dx,=,'.'),or,(dx,=,'..')
  640.                     jmp     skipperiod
  641.                 @ifend
  642.             @ifend
  643.             mov     cx,13           ;DTA上のファイル名から、長さを獲得
  644.             xor     al,al
  645.             cld
  646.           repne scasb
  647.             sub     cx,13
  648.             neg     cx
  649.             mov     fnamsiz,cx      ;ファイル名長さをセーブ
  650.             add     cx,copysiz      ;残りバッファサイズのチェックと更新
  651.             sub     namebuffsiz,cx
  652.             @if (cf,on)
  653.                 add     namebuffsiz,cx  ;不足
  654.                 jmp     short   srchout
  655.             @ifend
  656.             les     di,namebuff     ;共通パス名のコピー
  657.             lds     si,srchname
  658.             mov     cx,copysiz
  659.           rep   movsb
  660.             mov     ds,saveds       ;ファイル名のコピー
  661.             lds     si,dta
  662.             mov     cx,fnamsiz
  663.             rep     movsb
  664.             mov     ds,saveds
  665.             mov     word ptr namebuff,di    ;新オフセットの設定
  666.         @ifend
  667. skipperiod:
  668.         mov     ah,4fh              ;次のファイル名検索ファンクション
  669.         lds     dx,srchname
  670.         mov     cx,037h
  671.         int     21h                 ;見つかればパス名セーブ
  672.     @doend
  673.     mov ds,saveds
  674. srchout:
  675.     ret
  676. ;
  677. parentdir:
  678.     cld                             ; パス名長さを調べる
  679.     les     di,srchname
  680.     xor     ax,ax
  681.     mov     cx,-1
  682.   repne scasb
  683.     not     cx
  684.     sub     namebuffsiz,cx
  685.     @if (cf,on)
  686.         add     namebuffsiz,cx      ;不足
  687.         jmp     short   srchout
  688.     @ifend
  689.     les     di,namebuff             ;ファイル名のコピー
  690.     lds     si,srchname
  691.   rep movsb
  692.     mov     ds,saveds               ; DS 復元
  693.     mov     word ptr namebuff,di    ;新オフセットの設定
  694.     jmp     short   srchout
  695. ;
  696. dirlist    endp
  697. ;
  698. ;------------------------------------------------------------------------------
  699. ;
  700. ;   pathsep
  701. ;       パス名を調べて一番最後の':'か'\'までのバイト数を通知する
  702. ;
  703. ;   TYPE    near call
  704. ;   IN  CX      パス名長さ
  705. ;       ES:DI   パス名の先頭アドレス
  706. ;   OUT CX & ZERO FLAG 最後の':'or'\'までのバイト数 及び 0か?
  707. ;       DIR FLAG アップ方向
  708. ;   保存レジスタ    bx,si,bp,ds,es
  709. ;
  710. ;------------------------------------------------------------------------------
  711. ;
  712. pathsep     proc
  713. ;
  714.     @if (cx,/=,0)                   ; 0 でない時
  715.         push    cx                  ; 長さをセーブ
  716.         xor     dx,dx               ; 位置を初期化
  717.         @do until
  718.             mov     al,es:[di]      ; 文字獲得
  719.             inc     di
  720.             @cbegin
  721.             @case (al,=,':'),or,(al,=,'\'),S ; セパレータならば位置を記憶
  722.                 mov     dx,cx
  723.             @case (al,<,81h),or,(al,>,0fch),S ; α/N なにもしない
  724.             @case (al,>=,0a0h),and,(al,<=,0dfh),S ; カナ なにもしない
  725.             @other                  ; 漢字 第二バイト分を進める
  726.                 inc     di
  727.                 dec     cx          ; 残り0なら終了
  728.                 jz      analysend
  729.             @cend
  730.             dec     cx              ; 残り0なら終了
  731.         @doend (zf,on)
  732. analysend:
  733.         pop     cx                  ; パス名長を復元
  734.         @if (dx,/=,0),S             ; セパレータが有った時
  735.             dec     dx              ; DX にはパス名最後からのオフセット
  736.             sub     cx,dx           ; 先頭からのオフセットに直す
  737.         @else
  738.             xor     cx,cx           ; セパレータが無い時は0
  739.         @ifend
  740.     @ifend
  741.     ret
  742. ;
  743. pathsep     endp
  744. ;
  745. ;------------------------------------------------------------------------------
  746. ;
  747. ;   dirfind
  748. ;       パス名をもとにディレクトリかを調べ、ディレクトリの開始クラスタ
  749. ;       と、存在するドライブ番号を通知する
  750. ;
  751. ;   TYPE    near call
  752. ;   IN  ES:DI パス名の先頭アドレス
  753. ;   OUT AX ディレクトリの開始クラスタ番号
  754. ;       DL ドライブ番号
  755. ;       CARRY FLAG ディレクトリ属性 0:DIR 1:OTHERまたはルートでファイル無し
  756. ;   保存レジスタ    bp,ds
  757. ;
  758. ;------------------------------------------------------------------------------
  759. ;
  760. dirfind     proc
  761. ;
  762.     call    strcopywild             ; 検索用パス名の作成
  763. ;
  764.     mov     ah,2fh                  ; DTA 取得
  765.     int     21h
  766. ;
  767.     mov     ah,4eh                  ; ファイル検索
  768.     mov     cx,3fh
  769.     int     21h
  770.     @if (cf,off)                    ; 見つかった
  771.         mov     ax,es:[bx+0fh]      ; ディレクトリの開始クラスタ取得
  772.         xor     dx,dx
  773.         mov     dl,es:[bx]          ; ディレクトリのドライブ番号取得
  774.     @ifend
  775.     ret
  776. ;
  777. dirfind     endp
  778. ;
  779. ;------------------------------------------------------------------------------
  780. ;
  781. ;   strcopywild
  782. ;       指定されたパス名をPATHBUFFにコピーし、ワイルドカードを付加する
  783. ;
  784. ;   TYPE    near call
  785. ;   IN  ES:DI パス名の先頭アドレス
  786. ;   OUT PATHBUFF
  787. ;       ES:DI PATHBUFFのアドレス
  788. ;   保存レジスタ    bp,ds
  789. ;
  790. ;------------------------------------------------------------------------------
  791. ;
  792. strcopywild proc
  793. ;
  794.     cld                             ; パス名長さを調べる
  795.     mov     cx,-1
  796.     xor     ax,ax
  797.     mov     si,di
  798.   repne     scasb
  799.     not     cx
  800.     dec     cx
  801.     mov     ax,ds                   ; パス名をPATHBUFFにコピー
  802.     mov     dx,es
  803.     mov     ds,dx
  804.     mov     es,ax
  805.     mov     di,offset pathbuff
  806.     mov     dx,di
  807.     rep     movsb
  808.     mov     ds,ax                   ; ワイルドカード指定を付加
  809.     mov     cx,5
  810.     mov     si,offset wildcard
  811.     rep     movsb
  812. ;
  813.     mov     di,offset pathbuff
  814.     ret
  815. ;
  816. strcopywild endp
  817. ;
  818.     end
  819.